spliterator()
spliterator()
文档说明
- 创建一个 分割迭代器 (方法定义在 Iterable 接口)
- 实现类需要记录 spliterator 报告的 characteristic 值
- 但当 spliterator 报告了 size 或当前集合容器中无元素时,这个 characteristic值则无需报告
- 默认的实现需要被子类重写,返回一个更加高效的 spliterator
- 为了保留期望的 stream() 和 parallelStream() 的延迟行为,分割迭代器需要具有 IMMUTABLE 或 CONCURRENT 特性,或者设置为延迟绑定的(late-binding)
- 如果上述要求都无法实现,则重写的类需要去描写该分割迭代器的文档化的绑定策略,以及可能出现的修改的行为,并且还需要重写 stream() 和 parallelStream() 方法,通过 spliterator 的 Supplier 去创建流
- 这些要求确保了由 stream() 或 parallelStream() 生成的流在终止操作执行时能够反映出集合的内容
- 默认的实现是从集合的 Iterator 中创建了一个延迟绑定的 spliterator,这个 spliterator 继承了迭代器的 fail-fast(快速失败)属性
- 所创建出来的 spliterator 会包含 SIZED 特性值
- 同时,此 spliterator 还具有 SUBSIZED 特性值
- 若一个 spliterator 中没有元素,则特性值报告不会帮助客户端对 SIZED 与 SUBSIZED 以外的特性值进行控制、或进行专门的简化计算
- 这样可以确保了可以对空集合共享使用一个不可变的空的 spliterator 实例,并且可以确保客户能够判定该 spliterator 是否不包含任何元素
源码
Collection 中的 spliterator(),调用 Spliterators 的 spliterator() 方法,并将当前集合的引用传入
@Override default Spliterator<E> spliterator() { return Spliterators.spliterator(this, 0); }
Spliterators
- 静态类,以及方法,用于操作和创建 Spliterator 实例及其它原生特化实例
spliterator 方法
public static <T> Spliterator<T> spliterator(Collection<? extends T> c, int characteristics) { return new IteratorSpliterator<>(Objects.requireNonNull(c), characteristics); }
文档说明
- 基于 Iterator 的 spliterator
- 使用给定集合的 iterator() 作为数据源,并且将 size() 返回的值作为初始大小,创建一个 Spliterator
- 此 spliterator 是延迟绑定的,继承了集合的迭代器的“快速失败”的特性,并且实现了 trySplit() 用于有限的并行化
IteratorSpliterator
Spliterators 的内部类
文档说明
- 一个使用了一个给定 Iterator 的 Spliterator 进行元素的操作,实现 trySplit() 用于有限的并行化
- 持有所操作的集合对象的引用
public IteratorSpliterator(Collection<? extends T> collection, int characteristics) { this.collection = collection; this.it = null; this.characteristics = (characteristics & Spliterator.CONCURRENT) == 0 ? characteristics | Spliterator.SIZED | Spliterator.SUBSIZED : characteristics; }
- 创建一个 spliterator,使用给定的集合的迭代器进行遍历,并且将集合 size() 作为初始的 size